package lock;


import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

;

/**
 * @program: Dome
 * @description: lok
 * @className: Ticket
 * @author: rjt99999
 * @version: 1.0.0
 * @create: 2020-08-02 19:27
 **/
public class Ticket implements Runnable {
    //窗口卖票
    private int ticke = 100;



    //同步锁
    Lock lock = new ReentrantLock();


    @Override
    public void run() {

        while (true) {
            //共享数据 被改写 数据不安全  线程不同步
           /* if (ticke > 0) {

                try {
                    //出票时间
                    Thread.sleep(100);

                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                String name = Thread.currentThread().getName();
                System.out.println(name+"卖" + ticke--);*/

            //解决1 同步代码块 （加锁 [同步锁 --
            //                  对象的同步锁只是一个概念,可以想象为在对象上标记了一个锁.
            //                     1. 锁对象 可以是任意类型。2. 多个线程对象  要使用同一把锁 ]）
           /* synchronized (this) {
                //需要操作的代码
                if (ticke > 0) {

                    try {
                        //出票时间
                        Thread.sleep(100);

                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    String name = Thread.currentThread().getName();
                    System.out.println(name + "卖" + ticke--);
                }
            }*/




            //2调用
           // sellticke();





        //3 同步锁 louk
        /*java.util.concurrent.locks.Lock(轻量级的锁，synchronized 重量级的)
         *
         *   public void lock() :加同步锁。
         *  public void unlock() :释放同步锁
         * */

            lock.lock();
            if (ticke > 0) {


                try {
                    //出票时间
                    Thread.sleep(10);

                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                String name = Thread.currentThread().getName();
                System.out.println(name + "卖" + ticke--);
            }
            lock.unlock();







        }
    }
                //2 同步方法 :使用synchronized修饰的方法,

                /**
                 * 同步锁是谁?
                 对于非static方法,同步锁就是this。

                 对于static方法,我们使用当前方法所在类的字节码对象(类名.class)。

                 */
                // 锁是this
   /* public  synchronized  void sellticke(){

                    if (ticke > 0) {

                        try {
                            //出票时间
                            Thread.sleep(1000);

                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }

                        String name = Thread.currentThread().getName();
                        System.out.println(name + "卖" + ticke--);
                    }

                }
*/





}
